/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package edu.ufes.gpf.sgm.command.incluirPessoa;

import edu.ufes.gpf.sgm.command.ICommand;
import edu.ufes.gpf.sgm.model.Endereco;
import edu.ufes.gpf.sgm.model.Pessoa;
import edu.ufes.gpf.sgm.presenter.IncluirPessoaPresenter;
import java.io.IOException;
import javax.swing.JOptionPane;

/**
 *
 * @author Danilo
 */
public abstract class AbstractCommandPessoa implements ICommand
{

    protected IncluirPessoaPresenter receptor;

    public AbstractCommandPessoa(IncluirPessoaPresenter receptor)
    {
        this.receptor = receptor;
    }

    protected void valida() throws IOException, Exception
    {

        if (receptor.getView().getTxtNome().getText().equals(""))
        {
            JOptionPane.showMessageDialog(null, "Campo Nome Vazio!");

        }
        else if (receptor.getView().getTxtCPF().getText().equals("   .   .   -  "))
        {
            JOptionPane.showMessageDialog(null, "Campo CPF Vazio!");
        } 
        else if (!validaCPF(receptor.getView().getTxtCPF().getText()))
        {
            JOptionPane.showMessageDialog(null, "CPF Inválido!");
        } 
        else if (receptor.getView().getTxtLogradouro().getText().equals(""))
        {
            JOptionPane.showMessageDialog(null, "Campo Logradouro Vazio!");

        } 
        else if (receptor.getView().getTxtCidade().getText().equals(""))
        {
            JOptionPane.showMessageDialog(null, "Campo Cidade Vazio!");

        } 
        else if (receptor.getView().getCbmUf().getSelectedIndex() == 0)
        {
            JOptionPane.showMessageDialog(null, "Campo UF Não Selecionado!");

        } 
        else
        {
            Endereco endereco = new Endereco(receptor.getView().getTxtCidade().getText(), receptor.getView().getCbmUf().getSelectedItem().toString(), receptor.getView().getTxtLogradouro().getText());

            Pessoa pessoa = new Pessoa(receptor.getView().getTxtNome().getText(), receptor.getView().getTxtCPF().getText(), receptor.getView().getTxtTelefone().getText(), receptor.getView().getTxtTelefone().getText(), endereco);

            if (!pessoa.getNomeCompleto().contains(","))
            {
                if (salva(pessoa))
                {
                    JOptionPane.showMessageDialog(receptor.getView(), "Pessoa já existente");

                } else
                {
                    receptor.setPessoa(pessoa);
                    JOptionPane.showMessageDialog(receptor.getView(), receptor.getView().getTxtNome().getText() + " Cadastrado com sucesso!");

                }
            } else
            {
                throw new Exception("Nome não pode conter vírgula!");
            }
        }
    }

    protected abstract boolean salva(Pessoa pessoa) throws IOException;

    private boolean validaCPF(String cpf)
    {
        int count, Soma, x, y, CPF[] = new int[11];
        char vetorChar[] = new char[11];
        String temp, CPFvalido = "";
        Soma = 0;
        for (count = 0; count < 11; count++)
        {
            CPF[count] = 0;
        }
        cpf = cpf.replace(".", "");
        cpf = cpf.replace("-", "");

        for (count = 0; count < 11; count++)
        {
            // Transformar String em vetor de caracteres
            vetorChar = cpf.toCharArray();
            // Transformar cada caractere em String
            temp = String.valueOf(vetorChar[count]);
            // Transformar String em inteiro e jogar no vetor
            CPF[count] = Integer.parseInt(temp);
        }
        // Método da árvore para obter o x
        for (count = 0; count < 9; count++)
        {
            // Pegar soma da permutação dos dígitos do CPF
            Soma += CPF[count] * (10 - count);
        }

        // se o resto da divisão der 0 ou 1, x terá dois dígitos
        if (Soma % 11 < 2)
        {
            x = 0;  // x não pode ter dois dígitos
        } else
        {
            x = 11 - (Soma % 11); // obtendo o penúltimo dígito do CPF
        }
        CPF[9] = x;

        // Método da árvore para obter o y
        Soma = 0;
        for (count = 0; count < 10; count++)
        {
            // Pegar soma da permutação dos dígitos do CPF
            Soma += CPF[count] * (11 - count);
        }

        // se o resto da divisão der 0 ou 1, y terá dois dígitos
        if (Soma % 11 < 2)
        {
            y = 0;  // y não pode ter dois dígitos
        } else
        {
            y = 11 - (Soma % 11); // obtendo o último dígito do CPF
        }
        CPF[10] = y;
        Soma = 0;

        // Verificando se o cpf informado é válido para retornar resultado ao programa
        for (count = 0; count < 11; count++)
        {
            CPFvalido += String.valueOf(CPF[count]);
        }

        if (cpf.compareTo(CPFvalido) == 0)
        {
            return true;
        } else
        {
            return false;
        }

    }
}
